import java.util.Stack;

//JZ31 - 栈的压入，弹出序列
class Solution {
    public boolean IsPopOrder(int [] pushA,int [] popA) {
        Stack<Integer> stack = new Stack<>();
        int j = 0;
        for (int i = 0; i < pushA.length; i++) {
            stack.push(pushA[i]);
            while(!stack.empty() && j < popA.length && stack.peek() == popA[j]){
                stack.pop();
                j++;
            }
        }
        return stack.empty();
    }
}


//622 - 设计循环队列
class MyCircularQueue {
    private int[] elem;
    private int front;
    private int rear;
    public MyCircularQueue(int k) {
        elem = new int[k + 1];
        /**
         * 用的是浪费一个空间来判断队列有没有满
         * 因此要比题目给的空间大一个
         * 你也可以定义一个usedSize来判断有没有满，这样就只要k个空间
         */
    }

    public boolean enQueue(int value) {
        //尾插
        if(isFull()){
            return false;
        }
        elem[rear] = value;
        /**
         * 防止rear越界
         */
        rear = (rear+1)%elem.length;
        return true;
    }

    public boolean deQueue() {
        //头删
        if (isEmpty()){
            return false;
        }
        /**
         * 防止front越界
         */
        front = (front+1)%elem.length;
        return true;
    }

    public int Front() {
        if(isEmpty()){
            return -1;
        }
        return elem[front];
    }

    public int Rear() {
        if(isEmpty()){
            return -1;
        }
        /**
         * 因为我用的是浪费一个空间来判断队列有没有满
         * 所以rear的前一个才是最后一个的下标
         * 而当rear=0时，-1不能用来表示最后一个的下标
         * 所以要分情况讨论
         */
        int index = rear == 0 ? elem.length-1 : rear-1;
        return elem[index];
    }

    public boolean isEmpty() {
        return front == rear;
    }

    public boolean isFull() {
        if((rear+1)%elem.length == front){
            return true;
        }
        return false;
    }
}
public class Test {
}
